"""
本模块是程序中经常使用的一些小功能或者模块 ，具体列表：
1. 生成随机的不重复的字符串 --- 年月日时分秒 + 随机位
2. 生成随机的不重复的字符串 ---【uuid】
3. 上传文件 --- uploadFile
4. 读取Excel文件list ----- [[],[],[].....]
5. 读取Excel文件dict ----- [{},{},{}.....]
6. 导出数据到Excel文件


"""

# ----------- 引入模块  --------------
# ==导入基础模块==
from resources_base.module_base.import_base import *
# ==导入hashlib ==
import hashlib
# == 导入uuid ==
import uuid
# === 导入openpyxl ===
import openpyxl


# ------------ 具体的函数 ------------
def get_random_str_time(num: int):
    """生成随机的不重复的字符串--时间 """
    # 获取当前时间  --- 14位
    datetime_str = datetime.now().strftime("%Y%m%d%H%M%S")
    # 生成随机数  4  【1000-9999】
    temp_str = str(random.randint(math.pow(10, num-1), math.pow(10, num)-1))
    # 返回
    return datetime_str + temp_str


def get_random_str_uuid():
    """生成随机的不重复的字符串--uuid """
    # 获取uuid的随机值的对象
    uuid_val = uuid.uuid4()
    # 获取uuid字符串并转为utf-8
    uuid_str = str(uuid_val).encode('utf-8')
    # 生成hashlib中hd5的对象
    md5 = hashlib.md5()
    # 获取uuid的MD5的摘要
    md5.update(uuid_str)
    # 返回固定长度的文本
    return md5.hexdigest()


def upload_file(request, type:int):
    """
    上传文件
    :param request: http的request请求
    :type int: 定义随机名的类型  1--uuid  2--日期
    :return:
    """
    # 接收前台传递的文件 --- 前台提交上传的文件 key必须要是‘file’
    rev_file = request.FILES.get('file')
    # 判断是否有文件
    if not rev_file:
        # 返回
        return {'status': False, 'error': "上传的文件不存在！"}
    # 获取一个唯一的名字
    new_name = ""
    # 判断是那种类型的随即名
    if type == 1:
        new_name = get_random_str_uuid()
    elif type ==2:
        new_name = get_random_str_time(4)
    # 拼接完整的文件路径
    file_path = os.path.join(settings.MEDIA_ROOT, new_name + os.path.splitext(rev_file.name)[1])
    # 写入
    try:
        # 实例化一个open对象
        f = open(file_path, 'wb')
        # 如果文件大，多次写入
        for i in rev_file.chunks():
            # 写入
            f.write(i)
        # 关闭
        f.close()
        # 上传成功返回
        return {'status': True, 'name': new_name + os.path.splitext(rev_file.name)[1]}
    except Exception as e:
        return {'status': False, 'error': "上传的文件失败，具体原因：" + str(e)}


def read_excel_list(path: str, sheet:str, title: bool = True):
    """
    读取Excel文件中的某一个sheet, 存储到List
    """
    try:
        # 实例化一个workbook
        workbook = openpyxl.load_workbook(path)
        # 获取一个sheet
        sheet = workbook[sheet]
        # 定义一个集合
        data = []
        # 开始遍历
        for row_index, row_value in enumerate(sheet.rows):
            # 判断有没有标题
            if row_index == 0 and title:
                continue
            # 定义一个集合
            temp_list = []
            # 遍历每一行数据
            for col_index, col_value in enumerate(row_value):
                # 附加到list集合
                temp_list.append(col_value.value)
            # 附加
            data.append(temp_list)
        # 返回
        return {'status': True, 'data': data}

    except Exception as e:
        return {'status': False, 'error': '读取Excel文件出现异常，具体原因：' + str(e)}


def read_excel_dict(path: str, sheet:str, keys: list, title: bool = True):
    """
    读取Excel文件中的某一个sheet, 存储到Dict
    """
    try:
        # 实例化一个workbook
        workbook = openpyxl.load_workbook(path)
        # 获取一个sheet
        sheet = workbook[sheet]
        # 定义一个集合
        data = []
        # 开始遍历
        for row_index, row_value in enumerate(sheet.rows):
            # 判断有没有标题
            if row_index == 0 and title:
                continue
            # 定义一个集合
            temp_dict = {}
            # 遍历每一行数据
            for col_index, col_value in enumerate(row_value):
                # 附加到dict集合
                temp_dict[keys[col_index]]  = col_value.value
            # 附加
            data.append(temp_dict)
        # 返回
        return {'status': True, 'data': data}

    except Exception as e:
        return {'status': False, 'error': '读取Excel文件出现异常，具体原因：' + str(e)}


def export_to_excel(data: list, path:str, sheet_name:str, keys:list, title:list):
    """
    导出标准的Json格式的数据到Excel文件
    :param data: 标准的Json格式的数据
    :param path: 导出的Excel文件
    :param sheet: sheet表格的名称
    :param keys: 取数据的key的list ['sno','name','gender','dept','position','birthday','mobile']
    :param title: 导出到Excel的标题  ['学号','姓名','性别','部门','职位','出生日期','手机号码']
    :return:
    """
    # =============== 1. 在内存中构建虚拟的电子表格 ==============
    # 1.1 实例化一个workbook对象
    workbook = openpyxl.Workbook()
    # 1.2 新建一个sheet
    sheet = workbook.active
    # 1.3 给sheet命名
    sheet.title = sheet_name
    # 1.4 为导出的Excel插入标题
    if title:
        # 定义一个新的dict
        temp_dict = {}
        # 组合
        for index, value in enumerate(title):
            temp_dict[keys[index]] = value
        # 插入到最前面
        data.insert(0, temp_dict)

    # 1.5 构建表格的数据
    for row_index, row_value in enumerate(data):
        # 逐单元格写入
        for col_index, col_value in enumerate(keys):
            # 使用sheet写入
            sheet.cell(row= row_index + 1, column= col_index + 1, value=row_value.get(col_value))

    # =============== 2. 把内存中的表格写入到磁盘 ================
    try:
        # workbook.save()
        workbook.save(path)
        # 返回
        return {'status': True}
    except Exception as e:
        return {'status': False, 'error': '数据写入到Excel文件中出现异常， 具体原因：' + str(e)}






